雖然稱不上多難,但是找可用的方法東拼西湊還是要花點時間,紀錄一下幫看到這篇的人省點時間
需求:C++語言標準ISO C++20
只使用STL庫,不需額外Library
#include <chrono>
#include <sstream>
#include <iostream>
string date2EpochTime()
{
const int sec = 30; //秒數,兩位數
const int minute = 30; //分鐘,兩位數
const int hour = 6; //小時,24小時制
const int mday = 15; //日期
const int mon = 5; //月份,實際還要再+1,所以這代表6月
const int year = 120; //年份差,與1900年的差距,所以這是2020年
struct tm tm_tm = {sec, minute, hour, mday, mon, year};
const time_t time_t_tm = mktime(&tm_tm);
//注意,在轉成epoch time時API會自動扣掉當前時區的小時差,所以在某些情況下,
//可能會發生時區轉換導致的錯誤。比如說憑證中的到期日使用的是UTC,但是轉換時會視為GMT+8,
//所以轉換出來的epoch time會比實際上慢了8小時,解決辦法是取時區時間差在幫他補回去,如下:
//取時區時間差
const auto chrono_now = std::chrono::system_clock::now();
const auto offset_seconds = std::chrono::current_zone()->get_info(chrono_now).offset;
//將時間轉成epoch time
const auto time_point = std::chrono::system_clock::from_time_t(time_t_tm);
//把時區時間差補回去
const auto timeSinceEpoch = (time_point + offset_seconds).time_since_epoch().count();
std::stringstream stream;
stream << timeSinceEpoch;
//轉出來的epoch time取前10位,單位到秒
return stream.str().substr(0, 10);
}
std::string epochTime2Date(const std::string& epochTime)
{
long lEpochTime = std::stol(epochTime);
auto date = std::chrono::sys_time<std::chrono::seconds>{std::chrono::seconds{lEpochTime}};
std::string timezone = std::chrono::get_tzdb().current_zone()->name().data();
//print
std::cout << "Current timezone:" << timezone << std::endl;
std::chrono::zoned_seconds zt{timezone.c_str(), date};
std::ostringstream oss;
//oss << std::format("{:%F %T %Z}", zt); //2020-06-15 06:30:30 GMT+8
oss << std::format("{:%F}", zt); //2020-06-15
return oss.str();
}